/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


 /**
 *@file Vector.cpp
 *@brief Implementaciones de las funciones del módulo Vector
 *@author Mary Carmen Suarez
 *
 */

#include <iostream>
#include <cassert>
#include <Vector.h>

using namespace std;

Vector :: Vector()
{
	cadena=0;
	nelem=0;
	reservados=0;
}

Vector :: Vector(const Vector & orig)
{
	if (orig.reservados == 0)
	{
		cadena=0;
		nelem=0;
		reservados=0;
	}
	else
	{
		cadena=new unsigned char[orig.reservados];
		for(int i=0; i<orig.nelem; i++)
			cadena[i]= orig.cadena[i];
		nelem=orig.nelem;
		reservados=orig.reservados;
	}
}

Vector :: ~Vector()
{
	if (reservados != 0)
		delete [] cadena;
}

int Vector :: GetNelem () const
{
	return nelem;
}

unsigned char Vector :: GetCaracter (int pos) const
{
	assert (pos>=0 && pos<nelem);
	return cadena[pos];
}

void Vector :: Leer (istream & is)
{
	char c;
	while ( (c=is.get()) != '\0')
	{
		if (nelem == reservados)
			if (reservados == 0) Resize(2);
			else Resize(2*reservados);
		cadena[nelem]=c;
		nelem++;
	}
}

void Vector :: AddCaracter (char c)
{
	if (nelem == reservados)
		if (reservados == 0) Resize(2);
		else Resize(2*reservados);
	cadena[nelem]=c;
	nelem++;
	crc.Paridad_AddByte(c);
}

void Vector :: Resize (int tam)
{
	if (tam == 0)
	{
		cadena=0;
		nelem=0;
		reservados=0;
	}
	else
	{
		unsigned char * aux= new unsigned char[tam];
		if (nelem <= tam)
			for (int i=0; i <nelem; i++)
				aux[i]=cadena[i];
		else
			for (int i=0; i<tam; i++)
				aux[i]=cadena[i];
		delete [] cadena;
		cadena=aux;
		reservados=tam;
	}
}

void Vector :: Escribir (ostream & os)
{
	for (int i=0; i<nelem; i++)
		os << cadena[i];
}

unsigned int Vector :: GetParidad () const
{
	return crc.Paridad_Get();
}
